package Creational.Prototype.deepCopy;


//    深拷贝
//    对基本数据类型进行值传递，对引用数据类型，创建一个新的对象，并复制其内容，此为深拷贝。

//    实现深拷贝的步骤
//    1、实现Cloneable接口
//    2、原型对象的值类型内部也实现Cloneable接口和对应复写clone()
//    3、复写clone方法
//    4、把引用的对象也进行可控并进行返回

//        可见，改为深拷贝之后。
//        楚河汉界，各不相犯。你我各自独立。

//        可是利用clone的方式实现的深度拷贝，实在太麻烦。
//        比如我们Bean里面各种嵌套，原型对象的引用类型里面还有引用类型，嵌套四五层。
//        那么写这些clone也是够呛的。
//深拷贝是指只是完整的将变量的值拷贝过来，是一个新的对象，和被拷贝对象解耦合，一个改变，不会影响其它的内容。
public class Person  implements Cloneable{ // 深拷贝 step1
    public String perName;
    public int age;
    public Phone phone;
    @Override
    public Object clone() throws CloneNotSupportedException
    {
        //return super.clone();

        // 深拷贝 step3
        Person person = (Person) super.clone();
        // 深拷贝 step4 把 值类型 的成员变量也进行拷贝
        person.phone = ((Phone) (person.phone.clone()));
        return person;

    }

    @Override
    public String toString() {
        // TODO Auto-generated method stub
        return "info  :  goodsName:"+perName+"\n"+
                "age:"+age+"\n"+
                "phone.goodsName:"+phone.goodsName+"\n"+
                "phone.price:"+phone.price+"\n"+
                "phone.goodsId:"+phone.goodsId+"\n"
                ;
    }
}
